class User:
    def __init__(self, user_id):
        self.user_id = user_id
        self.follows = []  # 用户的关注对象
        self.contents = []  # 存放该用户发的所有推特内容，推特内容形式为：（时间， 推特ID）

    def post(self, *tweet):
        self.contents.append(tweet)

    def get(self, users):
        recommends = []  # 将关注对象的推特和自己发的推特都存进去
        for i in self.follows:
            recommends.extend(users[i].contents)
        recommends.extend(self.contents)
        recommends = sorted(recommends, key=lambda x: x[0])  # 对推荐列表按时间排序
        return [i[1] for i in recommends[: 10]]  # 返回最新的10条推特

    def follow(self, followee_id):
        if followee_id != self.user_id and followee_id not in self.follows:  # 验证
            self.follows.append(followee_id)

    def unfollow(self, followee_id):
        if followee_id != self.user_id and followee_id in self.follows:  # 验证
            self.follows.remove(followee_id)


class Twitter:
    def __init__(self):
        self.users = {}  # 推特用户池
        self.time = 0  # 系统时间

    def valid_users(self, *ids):  # 验证id是否在用户池中，如果不在，注册一个！
        for i in ids:
            if i not in self.users:
                self.users[i] = User(i)

    def post_tweet(self, user_id, tweet_id):
        self.valid_users(user_id)  # 验证
        self.users[user_id].post(self.time, tweet_id)  # 推特内容形式为：（时间， 推特ID）
        self.time -= 1

    def get_news(self, user_id):
        self.valid_users(user_id)  # 验证
        return self.users[user_id].get(self.users)  # 从推特用户池中找到user_id用户，发出get命令

    def follow(self, follower_id, followee_id):
        self.valid_users(follower_id, followee_id)  # 验证
        self.users[follower_id].follow(followee_id)  # 从推特用户池中找到user_id用户，发出follow命令

    def unfollow(self, follower_id, followee_id):
        self.valid_users(follower_id, followee_id)  # 验证
        self.users[follower_id].unfollow(followee_id)  # 从推特用户池中找到user_id用户，发出unfollow命令


if __name__ == '__main__':
    twitter = Twitter()
    twitter.post_tweet(1, 5)  # 用户1发送了一条新推文(用户id=1, 推文id=5).
    print(twitter.get_news(1))  # 用户1的获取推文应当返回一个列表，其中包含一个id为5的推文.
    twitter.follow(1, 2)  # 用户1关注了用户2.
    twitter.post_tweet(2, 6)  # 用户2发送了一个新推文(推文id=6).
    print(twitter.get_news(1))  # 用户1的获取推文应当返回一个列表，其中包含两个推文，id分别为 -> [6, 5]，推文id6应当在推文id5之前，因为它是在5之后发送的.
    twitter.unfollow(1, 2)  # 用户1取消关注了用户2.
    print(twitter.get_news(1))  # 用户1的获取推文应当返回一个列表，其中包含一个id为5的推文，因为用户1已经不再关注用户2.
